{\rtf0\ansi{\fonttbl\f2\fswiss Helvetica;\f3\fmodern Ohlfs;}
\paperw11040
\paperh8400
\margl40
\margr40
{\colortbl;\red0\green0\blue0;\red155\green103\blue77;\red0\green0\blue255;\red61\green0\blue0;\red255\green0\blue255;\red0\green41\blue0;}
\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f2\b0\i0\ulnone\fs28\fc1\cf1 #import <appkit/appkit.h>\

\b #import
\b0  
\gray451\fc2\cf2 "MemoController.h"
\gray0\fc1\cf1 \

\b #import
\b0  
\gray451\fc2\cf2 "MailComposer.h"
\gray0\fc1\cf1 \

\b #import
\b0  
\gray451\fc2\cf2 "TurboTFCell.h"
\gray0\fc1\cf1 \
\

\b\fs36 @implementation MemoController
\b0\fs28 \
\

\b\gray108\fc3\cf3 - appDidInit:sender\

\b0\gray0\fc1\cf1 \{\
	[
\b self
\b0  initialize:self];\
	\
	
\b return
\b0  
\b self
\b0 ;\
\}\
\

\b\gray108\fc3\cf3 - deliver:sender\

\b0\gray0\fc1\cf1 \{\
	
\b char
\b0  *to, *from, *org, *phone;\
	
\b int
\b0  i;\
	
\b char
\b0  *msg = (
\b char
\b0  *)malloc(
\f3\gray71\fc4\cf4 2048
\f2\gray0\fc1\cf1 *
\b sizeof
\b0 (
\b char
\b0 ));\
	\
	
\b if
\b0 (strlen([toField stringValue])<
\f3\gray71\fc4\cf4 3
\f2\gray0\fc1\cf1 )\
	\{\
		NXRunAlertPanel(
\gray451\fc2\cf2 "Alert"
\gray0\fc1\cf1 ,
\gray451\fc2\cf2 "Must specify a recipient."
\gray0\fc1\cf1 ,
\gray451\fc2\cf2 "Ok"
\gray0\fc1\cf1 ,
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 ,
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 );\
		
\b return
\b0  
\b nil
\b0 ;\
	\}\
	\

\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\fc1\cf1 	to = (char *)malloc(30*(sizeof(char)));\
	from = (char *)malloc(50*(sizeof(char)));\

\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\fc1\cf1 	org = (char *)malloc(50*(sizeof(char)));\

\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\fc1\cf1 	phone = (char *)malloc(40*(sizeof(char)));\
	\

\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\fc1\cf1 	strcpy(to,[toField stringValue]);\

\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\fc1\cf1 	strcpy(from,[fromField stringValue]?[fromField stringValue]:" ");\
	strcpy(org,[companyField stringValue]?[companyField stringValue]:" ");\

\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\fc1\cf1 	strcpy(phone,[phoneField stringValue]?[phoneField stringValue]:" ");\

\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\fc1\cf1 	\
	
\b for
\b0 (i=
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 ;i<=strlen(to);i++)\
	\{\
		
\b if
\b0 (to[i]==
\f3\gray409\fc5\cf5 0x0a
\f2\gray0\fc1\cf1 )\
			to[i]='\\
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 ';\
	\}\
	\
	
\b for
\b0 (i=
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 ;i<=strlen(from);i++)\
	\{\
		
\b if
\b0 (from[i]==
\f3\gray409\fc5\cf5 0x0a
\f2\gray0\fc1\cf1 )\
			from[i]='\\
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 ';\
	\}\
	\
	
\b for
\b0 (i=
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 ;i<=strlen(org);i++)\
	\{\
		
\b if
\b0 (org[i]==
\f3\gray409\fc5\cf5 0x0a
\f2\gray0\fc1\cf1 )\
			org[i]='\\
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 ';\
	\}\
	\
	
\b for
\b0 (i=
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 ;i<=strlen(phone);i++)\
	\{\
		
\b if
\b0 (phone[i]==
\f3\gray409\fc5\cf5 0x0a
\f2\gray0\fc1\cf1 )\
			phone[i]='\\
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 ';\
	\}\
	\
	[toField setStringValue:to];\
	\
	sprintf(msg,
\gray451\fc2\cf2 "\\nCaller:   %s from %s %s.\\nPriority:  %s\\nPhone:    %s\\nAction:   (%s)/(%s)\\n\\nMessage:  %s"
\gray0\fc1\cf1 ,(strlen(from)>
\f3\gray71\fc4\cf4 2
\f2\gray0\fc1\cf1 )?from:
\gray451\fc2\cf2 "Mojo Nixon"
\gray0\fc1\cf1 \
	,(strlen(org)>
\f3\gray71\fc4\cf4 2
\f2\gray0\fc1\cf1 )?org:
\gray451\fc2\cf2 "Nowhere"
\gray0\fc1\cf1 ,[rs state]?[rs title]:
\gray451\fc2\cf2 "called"
\gray0\fc1\cf1 ,[us state]?\
	
\gray451\fc2\cf2 "URGENT"
\gray0\fc1\cf1 :
\gray451\fc2\cf2 "normal"
\gray0\fc1\cf1 ,(strlen(phone)>
\f3\gray71\fc4\cf4 2
\f2\gray0\fc1\cf1 )?phone:
\gray451\fc2\cf2 "none"
\gray0\fc1\cf1 ,[pcs state]?[pcs\
	title]:
\gray451\fc2\cf2 ""
\gray0\fc1\cf1 ,[wcs state]?[wcs title]:
\gray451\fc2\cf2 ""
\gray0\fc1\cf1 ,[bodyField stringValue]?\
	[bodyField stringValue]:
\gray451\fc2\cf2 "No message."
\gray0\fc1\cf1 );\
	\
	[msgField setStringValue:msg];	\
	[mailComposer takeRemoteToStringValueFrom:toField];\
	[mailComposer takeRemoteSubjectStringValueFrom:subField];\
	[mailComposer takeRemoteBodyStringValueFrom:msgField];\
	[mailComposer remoteComposeAndDeliver:
\b self
\b0 ];\
		\
	NX_FREE(msg);\
	NX_FREE(to);\

\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\fc1\cf1 	NX_FREE(org);\
	NX_FREE(from);\

\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\fc1\cf1 	NX_FREE(phone);\
	\
	[
\b self
\b0  setMemoDirty:
\gray93\fc6\cf6 FALSE
\gray0\fc1\cf1 ];\
	[
\b self
\b0  new:
\b self
\b0 ];\
    
\b return
\b0  
\b self
\b0 ;\
\}\

\b\gray108\fc3\cf3 \
- new:sender\

\b0\gray0\fc1\cf1 \{\
	
\b int
\b0 	i, j, rows,cols;\
	\
	
\b if
\b0 ([
\b self
\b0  memoDirty])\
	\{\
		
\b if
\b0 (!NXRunAlertPanel(
\gray451\fc2\cf2 "Alert"
\gray0\fc1\cf1 ,\
			
\gray451\fc2\cf2 "You have a memo in progress. Destroy?"
\gray0\fc1\cf1 , \
			
\gray451\fc2\cf2 "Ok"
\gray0\fc1\cf1 ,
\gray451\fc2\cf2 "Cancel"
\gray0\fc1\cf1 ,
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 ))\
		\{\
			[memoPanel makeKeyAndOrderFront:
\b self
\b0 ];\
			
\b return
\b0  
\b self
\b0 ;\
		\}\
	\}\
	[
\b self
\b0  setMemoDirty:
\gray93\fc6\cf6 NO
\gray0\fc1\cf1 ];\
	[switchMatrix getNumRows:&rows numCols:&cols];\
	
\b for
\b0  (i=
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 ;i<rows;i++)\
		
\b for
\b0  (j=
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 ;j<cols;j++)\
				[[switchMatrix cellAt:i :j] setIntValue:
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 ];\
	\
	[toField setStringValue:
\gray93\fc6\cf6 NULL
\gray0\fc1\cf1 ];\
	[fromField setStringValue:
\gray93\fc6\cf6 NULL
\gray0\fc1\cf1 ];\
	[bodyField setStringValue:
\gray93\fc6\cf6 NULL
\gray0\fc1\cf1 ];\
	[companyField setStringValue:
\gray93\fc6\cf6 NULL
\gray0\fc1\cf1 ];\
	[phoneField setStringValue:
\gray93\fc6\cf6 NULL
\gray0\fc1\cf1 ];\
	
\b if
\b0  (!mailComposer)\
		mailComposer = [[MailComposer alloc] init];\
	[memoPanel display];\
	[memoPanel makeKeyAndOrderFront:
\b self
\b0 ];\
	[toField selectText:
\b self
\b0 ];\
	
\b return
\b0  
\b self
\b0 ;\
\}\
\

\b\gray108\fc3\cf3 - addSliders\

\b0\gray0\fc1\cf1 \{\
	
\b float
\b0  r,g,b;\
	
\b NXRect
\b0 	rRect;\
	
\b NXColor
\b0 	aColor;\
	
\b id
\b0 	rField,gField,bField;\
	
\b id
\b0 	aFont;\
	
\b const
\b0  
\b char
\b0  *rValue, *gValue, *bValue;\
	\
	rValue = NXGetDefaultValue([NXApp appName], 
\gray451\fc2\cf2 "rValue"
\gray0\fc1\cf1 );\
	
\b if
\b0 (rValue) r=atof(rValue); 
\b else
\b0  r=
\f3\gray71\fc4\cf4 0.8
\f2\gray0\fc1\cf1 ;\
	gValue = NXGetDefaultValue([NXApp appName], 
\gray451\fc2\cf2 "gValue"
\gray0\fc1\cf1 );\
	
\b if
\b0 (gValue) g=atof(gValue); 
\b else
\b0  g=
\f3\gray71\fc4\cf4 0.8
\f2\gray0\fc1\cf1 ;\
	bValue = NXGetDefaultValue([NXApp appName], 
\gray451\fc2\cf2 "bValue"
\gray0\fc1\cf1 );\
	
\b if
\b0 (bValue) b=atof(bValue); 
\b else
\b0  b=
\f3\gray71\fc4\cf4 0.8
\f2\gray0\fc1\cf1 ;\
	aColor = NXConvertRGBToColor(r,g,b);\
	[memoPanel setBackgroundColor:aColor];\
	\
	rRect.origin.x = 
\f3\gray71\fc4\cf4 236
\f2\gray0\fc1\cf1 ;\
	rRect.origin.y = 
\f3\gray71\fc4\cf4 220
\f2\gray0\fc1\cf1 ;\
	rRect.size.height = 
\f3\gray71\fc4\cf4 10
\f2\gray0\fc1\cf1 ;\
	rRect.size.width = 
\f3\gray71\fc4\cf4 50
\f2\gray0\fc1\cf1 ;\
	\
	aFont = [Font newFont:
\gray451\fc2\cf2 "Helvetica"
\gray0\fc1\cf1  size:
\f3\gray71\fc4\cf4 7.0
\f2\gray0\fc1\cf1 ];\
	rSlider = [[[[[[[[[Slider alloc] initFrame:&rRect] setKnobThickness:
\f3\gray71\fc4\cf4 4
\f2\gray0\fc1\cf1 ]\
		setMinValue:
\f3\gray71\fc4\cf4 0.0
\f2\gray0\fc1\cf1 ] setMaxValue:
\f3\gray71\fc4\cf4 1.0
\f2\gray0\fc1\cf1 ] setFloatValue:r]\
		setAction:
\b @selector
\b0 (setWindowColor:)] setContinuous:
\gray93\fc6\cf6 NO
\gray0\fc1\cf1 ]\
		setTag:
\f3\gray71\fc4\cf4 1
\f2\gray0\fc1\cf1 ];\
	rRect.origin.x+=
\f3\gray71\fc4\cf4 54
\f2\gray0\fc1\cf1 ;\
	rField = [[[[[[TextField alloc] initFrame:&rRect] setStringValue:
\gray451\fc2\cf2 "red"
\gray0\fc1\cf1 ]\
			 setFont:aFont] setBezeled:
\gray93\fc6\cf6 NO
\gray0\fc1\cf1 ] setSelectable:
\gray93\fc6\cf6 NO
\gray0\fc1\cf1 ];\
	rRect.origin.x-=
\f3\gray71\fc4\cf4 54
\f2\gray0\fc1\cf1 ;\
	rRect.origin.y += 
\f3\gray71\fc4\cf4 14
\f2\gray0\fc1\cf1 ;\
	gSlider = [[[[[[[[[Slider alloc] initFrame:&rRect] setKnobThickness:
\f3\gray71\fc4\cf4 4
\f2\gray0\fc1\cf1 ]\
		setMinValue:
\f3\gray71\fc4\cf4 0.0
\f2\gray0\fc1\cf1 ] setMaxValue:
\f3\gray71\fc4\cf4 1.0
\f2\gray0\fc1\cf1 ] setFloatValue:g]\
		setAction:
\b @selector
\b0 (setWindowColor:)] setContinuous:
\gray93\fc6\cf6 NO
\gray0\fc1\cf1 ]\
		setTag:
\f3\gray71\fc4\cf4 2
\f2\gray0\fc1\cf1 ];\
	rRect.origin.x+=
\f3\gray71\fc4\cf4 54
\f2\gray0\fc1\cf1 ;\
	gField = [[[[[[TextField alloc] initFrame:&rRect] setStringValue:
\gray451\fc2\cf2 "green"
\gray0\fc1\cf1 ]\
			 setFont:aFont] setBezeled:
\gray93\fc6\cf6 NO
\gray0\fc1\cf1 ] setSelectable:
\gray93\fc6\cf6 NO
\gray0\fc1\cf1 ];\
	rRect.origin.x-=
\f3\gray71\fc4\cf4 54
\f2\gray0\fc1\cf1 ;\
	rRect.origin.y += 
\f3\gray71\fc4\cf4 14
\f2\gray0\fc1\cf1 ;\
	bSlider = [[[[[[[[[Slider alloc] initFrame:&rRect] setKnobThickness:
\f3\gray71\fc4\cf4 4
\f2\gray0\fc1\cf1 ]\
		setMinValue:
\f3\gray71\fc4\cf4 0.0
\f2\gray0\fc1\cf1 ] setMaxValue:
\f3\gray71\fc4\cf4 1.0
\f2\gray0\fc1\cf1 ] setFloatValue:b]\
		setAction:
\b @selector
\b0 (setWindowColor:)] setContinuous:
\gray93\fc6\cf6 NO
\gray0\fc1\cf1 ]\
		setTag:
\f3\gray71\fc4\cf4 3
\f2\gray0\fc1\cf1 ];\
	rRect.origin.x+=
\f3\gray71\fc4\cf4 54
\f2\gray0\fc1\cf1 ;\
	bField = [[[[[[TextField alloc] initFrame:&rRect] setStringValue:
\gray451\fc2\cf2 "blue"
\gray0\fc1\cf1 ]\
			 setFont:aFont] setBezeled:
\gray93\fc6\cf6 NO
\gray0\fc1\cf1 ] setSelectable:
\gray93\fc6\cf6 NO
\gray0\fc1\cf1 ];\
	[[memoPanel contentView] addSubview:rSlider];\
	[[memoPanel contentView] addSubview:gSlider];\
	[[memoPanel contentView] addSubview:bSlider];\
	[[memoPanel contentView] addSubview:rField];\
	[[memoPanel contentView] addSubview:gField];\
	[[memoPanel contentView] addSubview:bField];\
\
	
\b return
\b0  
\b self
\b0 ;\
\}\
\

\b\gray108\fc3\cf3 - free\

\b0\gray0\fc1\cf1 \{\
	[mailComposer free];\
	[memoPanel free];\
	\
	
\b return
\b0  [
\b super
\b0  free];\
\}\

\b\gray108\fc3\cf3 - initialize:sender\

\b0\gray0\fc1\cf1 \{\
	[bodyField setAcceptsReturn:
\gray93\fc6\cf6 TRUE
\gray0\fc1\cf1 ];\
	[
\b self
\b0  addSliders];\
	[
\b self
\b0  new:
\b self
\b0 ];\
	
\b return
\b0  
\b self
\b0 ;\
\}\
\

\b\gray108\fc3\cf3 - setWindowColor:sender\

\b0\gray0\fc1\cf1 \{\
	
\b NXColor
\b0 	aColor;\
	
\b float
\b0 		r,g,b;\
	
\b char
\b0 		str[
\f3\gray71\fc4\cf4 16
\f2\gray0\fc1\cf1 ];\
	\
	aColor = [memoPanel backgroundColor];\
	NXConvertColorToRGB(aColor,&r,&g,&b);\
\
	
\b switch
\b0 ([
\b sender
\b0  tag])\
	\{\
		
\b case
\b0  
\f3\gray71\fc4\cf4 1
\f2\gray0\fc1\cf1 :\
			r=[
\b sender
\b0  floatValue];\
			sprintf(str,
\gray451\fc2\cf2 "%f"
\gray0\fc1\cf1 ,r);\
			NXWriteDefault([NXApp appName],
\gray451\fc2\cf2 "rValue"
\gray0\fc1\cf1 ,str);\
			
\b break
\b0 ;\
		
\b case
\b0  
\f3\gray71\fc4\cf4 2
\f2\gray0\fc1\cf1 :\
			g=[
\b sender
\b0  floatValue];\
			sprintf(str,
\gray451\fc2\cf2 "%f"
\gray0\fc1\cf1 ,g);\
			NXWriteDefault([NXApp appName],
\gray451\fc2\cf2 "gValue"
\gray0\fc1\cf1 ,str);\
			
\b break
\b0 ;\
		
\b case
\b0  
\f3\gray71\fc4\cf4 3
\f2\gray0\fc1\cf1 :\
			b=[
\b sender
\b0  floatValue];\
			sprintf(str,
\gray451\fc2\cf2 "%f"
\gray0\fc1\cf1 ,b);\
			NXWriteDefault([NXApp appName],
\gray451\fc2\cf2 "bValue"
\gray0\fc1\cf1 ,str);\
			
\b break
\b0 ;\
	\}\
	aColor = NXConvertRGBToColor(r,g,b);\
	\
	[memoPanel setBackgroundColor:aColor];\
	[memoPanel display];\
	\
	
\b return
\b0  
\b self
\b0 ;\
\}\

\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\b\gray108\fc3\cf3 - quit:sender\

\b0\gray0\fc1\cf1 \{\
	
\b if
\b0 ([self memoDirty])\
		
\b if
\b0 (NXRunAlertPanel(
\gray451\fc2\cf2 "Alert"
\gray0\fc1\cf1 ,
\gray451\fc2\cf2 "You have an undelivered memo",
\gray0\fc1\cf1 \
			
\gray451\fc2\cf2 "Close"
\gray0\fc1\cf1 ,
\gray451\fc2\cf2 "Cancel"
\gray0\fc1\cf1 ,
\f3\gray71\fc4\cf4 0
\f2\gray0\fc1\cf1 )==
\gray93\fc6\cf6 NX_CANCELTAG
\gray0\fc1\cf1 )\
			
\b return
\b0  
\b nil
\b0 ;\
	[self setMemoDirty:
\gray93\fc6\cf6 NO
\gray0\fc1\cf1 ];\
	[NXApp terminate:self];\
	
\b return
\b0  
\b self
\b0 ;\
\}\

\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\fc1\cf1 \

\b\gray108\fc3\cf3 - setMemoDirty:(BOOL)flag\

\b0\gray0\fc1\cf1 \{\
	memoDirty = flag;\
	[memoPanel setDocEdited:flag];\
	
\b return
\b0  
\b self
\b0 ;\
\}\

\b\gray108\fc3\cf3 - (BOOL)memoDirty 
\b0\gray0\fc1\cf1 \{ 
\b return
\b0  memoDirty; \}\
\

\b\fs36 @end
\b0\fs28 \

}
